package bz.yfw.example.s3blazeds.part2.command
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.geom.Matrix;
	
	import jp.shichiseki.exif.ExifInfo;
	import jp.shichiseki.exif.ExifLoader;
	
	import org.seasar.akabana.yui.command.Command;

	public class OrientationCommand extends Command
	{
		public function OrientationCommand() {
			super();
		}
		protected override function run(...param):void {
			var loader:ExifLoader = param[0];
			execute(loader);
		}
		
		public function execute(loader:ExifLoader):void {
			
			var exifInfo:ExifInfo = loader.exif;
			var orient:int = exifInfo.ifds.primary["Orientation"] as int;
			var bmp:Bitmap = loader.content as Bitmap;
			done(correctExifOrient(bmp.bitmapData, orient, 0.25));
		}
		
		/**
		 * EixfのOrientation(回転情報)から、正の位置に補正したBitmapDataを返す.
		 * @param bitmapData 補正前のBitmapData
		 * @param exifOrient　exifのOrient情報 1~6
		 * @see http://sylvana.net/jpegcrop/exif_orientation.html
		 */
		public function correctExifOrient(
			bitmapData:BitmapData, exifOrient:int, scaleData:Number = 1):BitmapData
		{
			var correctBMD : BitmapData;
			var mat : Matrix = new Matrix();
			var w:uint = bitmapData.width;
			var h:uint = bitmapData.height;
			
			switch(exifOrient) {
				case 2:
					// trace(exifOrient  + " : 左右反転している");
					correctBMD = new BitmapData(w, h);
					mat.a = -1;
					mat.translate(bitmapData.width, 0);
					break;
				case 3:
					// trace(exifOrient  + " : 180°回転している");
					correctBMD = new BitmapData(w, h);
					mat.rotate(180 * (Math.PI / 180));
					mat.translate(bitmapData.width, bitmapData.height);
					break;
				case 4:
					// trace(exifOrient + " : 上下反転している");
					correctBMD = new BitmapData(w, h);
					mat.d = -1;
					mat.translate(0, bitmapData.height);
					break;
				case 5:
					// trace(exifOrient + " : 上下反転 > 時計回りに90°回転している ");
					correctBMD = new BitmapData(h, w);
					mat.a = -1;
					mat.rotate(-90 * (Math.PI / 180));
					break;
				case 6:
					// trace(exifOrient + " : 反時計回りに90°回転している");
					correctBMD = new BitmapData(h, w);
					mat.rotate(90 * (Math.PI / 180));
					mat.translate(bitmapData.height, 0);
					break;
				case 7:
					// trace(exifOrient  + " : 上下反転 > 反時計回りに90°回転 している");
					correctBMD = new BitmapData(h, w);
					mat.d = -1;
					mat.rotate(-90 * (Math.PI / 180));
					mat.translate(bitmapData.height, bitmapData.width);
					break;
				case 8:
					// trace(exifOrient  + " : 時計回りに90°回転している");
					correctBMD = new BitmapData(h, w);
					mat.rotate(-90 * (Math.PI / 180));
					mat.translate(0, bitmapData.width);
					
					break;
				default :
					// trace(exifOrient + " :通常 or 回転情報がありません");
					correctBMD = new BitmapData(w, h);
					break;
			}
			mat.scale(scaleData, scaleData);
			correctBMD.draw(bitmapData, mat);
			return correctBMD;
		}
	}
}